{# BENTOML INTERNAL #}
{# users can use these values #}
{% import '_macros.j2' as common %}
{% set bento__entrypoint = bento__entrypoint | default(expands_bento_path("env", "docker", "entrypoint.sh", bento_path=bento__path)) %}
{% set __enable_buildkit__ = bento__enable_buildkit | default(False) -%}
{% if __enable_buildkit__ %}
# 1.2.1 is the current docker frontend that both buildkitd and kaniko supports.
# syntax = {{ bento__buildkit_frontend }}
#
{% endif %}
{% if bento__add_header %}
# ===========================================
#
# THIS IS A GENERATED DOCKERFILE. DO NOT EDIT
#
# ===========================================
{% endif %}

# Block SETUP_BENTO_BASE_IMAGE
{% block SETUP_BENTO_BASE_IMAGE %}
FROM {{ __base_image__ }} as base-container

ENV LANG=C.UTF-8

ENV LC_ALL=C.UTF-8

ENV PYTHONIOENCODING=UTF-8

ENV PYTHONUNBUFFERED=1

{% if __is_cuda__ %}
ENV NVIDIA_VISIBLE_DEVICES=
{% endif %}

{% endblock %}

# Block SETUP_BENTO_USER
{% block SETUP_BENTO_USER %}
ARG BENTO_USER={{ bento__user }}
ARG BENTO_USER_UID={{ bento__uid_gid }}
ARG BENTO_USER_GID={{ bento__uid_gid }}
RUN groupadd -g $BENTO_USER_GID -o $BENTO_USER && useradd -m -u $BENTO_USER_UID -g $BENTO_USER_GID -o -r $BENTO_USER
{% endblock %}
{% block SETUP_BENTO_ENVARS %}
{% if __options__env is not none %}
{% for key, value in __options__env.items() -%}
ARG {{ key }}={{ value }}
ENV {{ key }}=${{ key }}
{% endfor -%}
{% endif -%}

ARG BENTO_PATH={{ bento__path }}
ENV BENTO_PATH=$BENTO_PATH
ENV BENTOML_HOME={{ bento__home }}
ENV BENTOML_HF_CACHE_DIR={{ bento__path }}/hf-models
ENV BENTOML_CONTAINERIZED=true

RUN mkdir $BENTO_PATH && chown {{ bento__user }}:{{ bento__user }} $BENTO_PATH -R
WORKDIR $BENTO_PATH

{% endblock %}

# Block SETUP_BENTO_COMPONENTS
{% block SETUP_BENTO_COMPONENTS %}

RUN command -v uv >/dev/null || pip install uv
RUN UV_PYTHON_INSTALL_DIR=/app/python/ uv venv {% if __options__python_version %}-p {{ __options__python_version }}{% endif %} /app/.venv && \
    chown -R {{ bento__user }}:{{ bento__user }} /app/.venv
ENV VIRTUAL_ENV=/app/.venv
ENV UV_COMPILE_BYTECODE=1
ENV PATH="/app/.venv/bin:$PATH"
{% set __pip_cache__ = common.mount_cache("/root/.cache/uv") %}

COPY --chown={{ bento__user }}:{{ bento__user }} ./env/python ./env/python/
{% set __install_python_scripts__ = expands_bento_path("env", "python", "install.sh", bento_path=bento__path) %}
# install python packages with install.sh
{% call common.RUN(__enable_buildkit__) -%} {{ __pip_cache__ }} {% endcall -%} bash -euxo pipefail {{ __install_python_scripts__ }}
COPY --chown={{ bento__user }}:{{ bento__user }} . ./
{% if __options__setup_script is not none %}
{% set __setup_script__ = expands_bento_path("env", "docker", "setup_script", bento_path=bento__path) %}
ADD ./env/docker/setup_script {{ __setup_script__ }}
RUN chmod +x {{ __setup_script__ }}
RUN {{ __setup_script__ }}
{% endif %}
{% endblock %}

# Block SETUP_BENTO_ENTRYPOINT
{% block SETUP_BENTO_ENTRYPOINT %}
# Default port for BentoServer
EXPOSE 3000

# Expose Prometheus port
EXPOSE {{ __prometheus_port__ }}

RUN chmod +x {{ bento__entrypoint }}

USER bentoml

ENTRYPOINT [ "{{ bento__entrypoint }}" ]

{% endblock %}
